package com.horizon.common.service;

import com.horizon.common.entity.IBaseEntity;
import com.horizon.common.repository.HQLInfo;
import com.horizon.common.repository.Page;

import java.util.List;

/**
 * 基本业务逻辑操作接口
 *
 * @author wangfuwei
 * @version 2018-08-07
 */
public interface IBaseService<S extends IBaseEntity> {
    /**
     * 持久化实体类
     *
     * @param entity
     */
    <T extends IBaseEntity> void persist(T entity);

    /**
     * 删除实体类
     *
     * @param entity
     */
    <T extends IBaseEntity> void remove(T entity);

    /**
     * 删除实体类
     *
     * @param fdId
     */
    void remove(String fdId);

    /**
     * 删除实体类
     *
     * @param fdIdList
     */
    void remove(List<String> fdIdList);

    /**
     * 保存或更新实体类
     *
     * @param entity
     * @return
     */
    <T extends IBaseEntity> T merge(T entity);

    /**
     * 根据主键查询实体类
     *
     * @param entityClass 实体类 Class
     * @param fdId        主键
     * @return
     * @throws Exception
     */
    <T extends IBaseEntity> T find(Class<T> entityClass, String fdId);

    /**
     * 根据主键查询实体类
     *
     * @param entityClass 实体类 Class
     * @param fdIdList    主键
     * @return
     * @throws Exception
     */
    <T extends IBaseEntity> List<T> find(Class<T> entityClass, List<String> fdIdList);

    /**
     * 根据主键查询实体类
     *
     * @param fdId 主键
     * @return
     * @throws Exception
     */
    S find(String fdId);

    /**
     * 根据主键查询实体类
     *
     * @param fdIdList 主键
     * @return
     * @throws Exception
     */
    List<S> find(List<String> fdIdList);

    /**
     * 根据主键查询实体类(懒加载)
     *
     * @param entityClass 实体类 Class
     * @param fdId        主键
     * @return
     * @throws Exception
     */
    <T extends IBaseEntity> T getReference(Class<T> entityClass, String fdId);

    /**
     * 根据主键查询实体类(懒加载)
     *
     * @param entityClass 实体类 Class
     * @param fdIdList    主键
     * @return
     * @throws Exception
     */
    <T extends IBaseEntity> List<T> getReference(Class<T> entityClass, List<String> fdIdList);

    /**
     * 根据主键查询实体类(懒加载)
     *
     * @param fdId 主键
     * @return
     * @throws Exception
     */
    S getReference(String fdId);

    /**
     * 根据主键查询实体类(懒加载)
     *
     * @param fdIdList 主键
     * @return
     * @throws Exception
     */
    List<S> getReference(List<String> fdIdList);

    /**
     * 根据主键判断存在持久化实体类
     *
     * @param entityClass 实体类 Class
     * @param fdId        主键
     * @param <T>
     * @return
     */
    <T extends IBaseEntity> Boolean isExist(Class<T> entityClass, String fdId);

    /**
     * 根据主键判断存在持久化实体类
     *
     * @param fdId 主键
     * @return
     */
    Boolean isExist(String fdId);

    /**
     * 根据HQL语句查询列表数据
     *
     * @param hqlInfo
     * @param <T>
     * @return
     */
    <T> List<T> findList(HQLInfo hqlInfo);

    /**
     * 根据查询条件查询列表数据
     *
     * @param entityClass 实体类 Class
     * @param whereBlock  查询条件
     * @param orderBy     排序字段
     * @param <T>
     * @return
     */
    <T extends IBaseEntity> List<T> findList(Class<T> entityClass, String whereBlock, String orderBy);

    /**
     * 根据查询条件查询列表数据
     *
     * @param whereBlock 查询条件
     * @param orderBy    排序字段
     * @return
     */
    List<S> findList(String whereBlock, String orderBy);

    /**
     * 根据查询条件查询列表数据
     *
     * @param entityClass 实体类 Class
     * @param selectBlock 查询条件
     * @param whereBlock  查询条件
     * @param orderBy     排序字段
     * @param <T>
     * @return
     */
    <T> List<T> findList(Class<T> entityClass, String selectBlock, String whereBlock, String orderBy);

    /**
     * 根据查询条件查询列表数据
     *
     * @param selectBlock 查询条件
     * @param whereBlock  查询条件
     * @param orderBy     排序字段
     * @return
     */
    <T> List<T> findList(String selectBlock, String whereBlock, String orderBy);

    /**
     * 根据属性查找列表数据
     *
     * @param entityClass  实体类 Class
     * @param propertyName 属性名称
     * @param value        属性值
     * @param <T>
     * @return
     */
    <T> List<T> findByProperty(Class<T> entityClass, String propertyName, Object value);

    /**
     * 根据属性查找列表数据
     *
     * @param propertyName 属性名称
     * @param value        属性值
     * @return
     */
    List<S> findByProperty(String propertyName, Object value);

    /**
     * 根据HQL语句查询分页数据
     *
     * @param hqlInfo
     * @return
     */
    Page findPage(HQLInfo hqlInfo);

    /**
     * 与数据库同步实体类（一般Controller层使用）
     *
     * @param entity
     * @param <T>
     * @return
     */
    <T extends IBaseEntity> T syncEntity(IBaseEntity... entity);
}
